## Elias upper bound

from PyM import *

def ub_elias(n,d,q=2):
    b = (q-1)/q
    def f(r):
        return r**2-2*b*n*r+b*n*d
    R = range( int( floor(b*n) )+1 )
    M = q**n
    for r in R:
        if f(r)>0:
            A = int( floor((b*n*d/f(r))*q**n/volume(n,r,q)) )
            if A<M: M = A
    if q==2 and d%2:
        M = min(M,ub_elias(n+1,d+1))
    return M

# Examples
show(ub_elias(13,5))
show(ub_elias(14,6))
    
        